package com.urbainski.componentes.validators
{
	import com.urbainski.componentes.utils.StringUtils;
	
	import flash.events.FocusEvent;
	
	import mx.events.FlexEvent;
	import mx.events.ValidationResultEvent;
	import mx.validators.PhoneNumberValidator;
	import mx.validators.ValidationResult;
	import mx.validators.Validator;
	
	/**
	 * @author Cristian Elder Urbainski
	 * @since 29/12/2011
	 */
	
	public class MyValidatorMaskedInput extends Validator
	{
		//outros validatores, que o MyValidatorMaskedInput faz uso
		private var _cpfValidator : MyCPFValidator = new MyCPFValidator();
		private var _cepValidator : MyCEPValidator = new MyCEPValidator();
		private var _cnpjValidator : MyCNPJValidator = new MyCNPJValidator();
		private var _foneValidator : PhoneNumberValidator  = new PhoneNumberValidator();
		
		//propriedades que dizes qual validator sera aplicado, se o resultado
		//deste validator for válido
		private var _validateCpf : Boolean = false;
		private var _validateCnpj : Boolean = false;
		private var _validateCep : Boolean = false;
		private var _validateFone : Boolean = false;
		
		//geters e seters das propriedades acima
		public function get validateCpf(): Boolean {
			return _validateCpf;
		}
		
		[Bindable]
		public function set validateCpf(value : Boolean) : void {
			if(value == _validateCpf){
				return;
			}
			
			_validateCpf = value;
		
			_validateFone = false;
			_validateCep = false;
			_validateCnpj = false;
		}
		
		public function get validateCnpj(): Boolean {
			return _validateCnpj;
		}
		
		[Bindable]
		public function set validateCnpj(value : Boolean) : void {
			if(value == _validateCnpj){
				return;
			}
			
			_validateCnpj = value;
			
			_validateFone = false;
			_validateCep = false;
			_validateCpf = false;
		}
		
		public function get validateCep(): Boolean {
			return _validateCep;
		}
		
		[Bindable]
		public function set validateCep(value : Boolean) : void {
			if(value == _validateCep){
				return;
			}
			
			_validateCep = value;
			
			_validateCnpj = false;
			_validateCpf = false;
			_validateFone = false;
		}
		
		public function get validateFone(): Boolean {
			return _validateFone;
		}
		
		[Bindable]
		public function set validateFone(value : Boolean) : void {
			if(value == _validateFone){
				return;
			}
			
			_validateFone = value;
			
			_validateCep = false;
			_validateCnpj = false;
			_validateCpf = false;
		}
		
		//objetos deste validator
		private var _enabled:Boolean = true;
		private var _mask : String;
		
		public function get mask():String{
			return _mask;
		}
		
		[Bindable]
		public function set mask(value : String):void {
			_mask = value.toString();
		}
		
		public function MyValidatorMaskedInput()
		{
			super();
			
			super.triggerEvent = FocusEvent.FOCUS_OUT;
		}
		
		override protected function doValidation(value:Object):Array
		{
			if(_mask == null || _mask.length == 0){
				return new Array();
			}
			
			var objEdicao : String = source.text;
			
			var results : Array = super.doValidation(objEdicao);
			
			if(objEdicao.indexOf("_") != -1){
				results.push(new ValidationResult(true, null, "Erro", "Valor não informado totalmente"));
				return results;
			}

			if(results.length == 0){
				var resultado : ValidationResultEvent;
				
				if(_validateCep){
					resultado = _cepValidator.validate(objEdicao);
					
					if(resultado.type == "invalid"){
						results.push(new ValidationResult(true, null, "Erro", "Cep inválido"));
						return results;
					}
				} else if(_validateCnpj){
					resultado = _cnpjValidator.validate(objEdicao);
					
					if(resultado.type == "invalid"){
						results.push(new ValidationResult(true, null, "Erro", "Cnpj inválido"));
						return results;
					}
				} else if(_validateCpf){
					resultado = _cpfValidator.validate(source);
					
					if(resultado.type == "invalid"){
						results.push(new ValidationResult(true, null, "Erro", "Cpf inválido"));
						return results;
					}
				} else if(_validateFone){
					resultado = _foneValidator.validate(objEdicao);
					
					if(resultado.type == "invalid"){
						results.push(new ValidationResult(true, null, "Erro", "Número Telefone inválido"));
						return results;
					}
				}
			}
			
			return results;
		}
			
		override public function set enabled(value:Boolean):void
		{
			_enabled = value; 
			if (!_enabled)
				this.validate("");
			
			super.enabled = value;
		}
		
	}
}